#ifndef _WX_RICHTEXTXML_H_
#define _WX_RICHTEXTXML_H_

#include "wx/richtext/richtextbuffer.h"
#include "wx/richtext/richtextstyles.h"

class wxXmlNode;

class wxRichTextXMLHandler: public wxRichTextFileHandler {
    DECLARE_CLASS( wxRichTextXMLHandler )
  public:
    wxRichTextXMLHandler( const wxString& name = wxT( "XML" ), const wxString& ext = wxT( "xml" ), int type = wxRICHTEXT_TYPE_XML )
      : wxRichTextFileHandler( name, ext, type ) { }

    #if wxUSE_STREAMS
    /// Recursively export an object
    bool ExportXML( wxOutputStream& stream, wxMBConv* convMem, wxMBConv* convFile, wxRichTextObject& obj, int level );
    bool ExportStyleDefinition( wxOutputStream& stream, wxMBConv* convMem, wxMBConv* convFile, wxRichTextStyleDefinition* def, int level );

    /// Recursively import an object
    bool ImportXML( wxRichTextBuffer* buffer, wxXmlNode* node );
    bool ImportStyleDefinition( wxRichTextStyleSheet* sheet, wxXmlNode* node );

    /// Create style parameters
    wxString CreateStyle( const wxTextAttrEx& attr, bool isPara = false );

    /// Get style parameters
    bool GetStyle( wxTextAttrEx& attr, wxXmlNode* node, bool isPara = false );
    #endif

    /// Can we save using this handler?
    virtual bool CanSave() const { return true; }

    /// Can we load using this handler?
    virtual bool CanLoad() const { return true; }

    // Implementation

    bool HasParam( wxXmlNode* node, const wxString& param );
    wxXmlNode *GetParamNode( wxXmlNode* node, const wxString& param );
    wxString GetNodeContent( wxXmlNode *node );
    wxString GetParamValue( wxXmlNode *node, const wxString& param );
    wxString GetText( wxXmlNode *node, const wxString& param = wxEmptyString, bool translate = false );

  protected:
    #if wxUSE_STREAMS
    virtual bool DoLoadFile( wxRichTextBuffer *buffer, wxInputStream& stream );
    virtual bool DoSaveFile( wxRichTextBuffer *buffer, wxOutputStream& stream );
    #endif
};

#endif
